package report

import user.User;


/**
 * Classe de serviço oferecida para manipulação das atividades no sistema.
 * 
 * @author Vítor Avelino - vitor88@gmail.com
 *
 */
class ActivityService {
	
	/**
	 * Retorna lista de atividades de acordo com os parâmetros que lhe são passados.
	 * 
	 * @param 	params 	Mapa que contém os parâmetros da consulta
	 * @return 	l 		Lista de atividades
	 */
	def getActivities(params) {
		return Activity.list(params)
	}
	
	/**
	 * Retorna o número de atividades armazenadas no sistema.
	 * 
	 * @return n Número de atividades
	 */
	def getNumberActivities() {
		return Activity.count()
	}
	
	/**
	 * Salva a atividade no banco de dados do sistema.
	 * 
	 * @param 	activity 	Atividade a ser salva
	 * @return	null 		Caso os dados da atividade não sejam validados
	 * 						ou aconteça algum erro durante a operação
	 * 			atividade 	Caso contrário
	 * 	
	 */
	def save(activity) {
		if (activity.validate()) {
			if (activity.startDate > activity.endDate) {
				activity.errors.rejectValue("startDate", "invalid.startDate", "Data de início não pode ser maior que a de fim.")
				return false
			}
			if (activity.id) {
				def oldSponsors = User.list([activities:"eager"])
				oldSponsors.each {
					if (!activity.sponsors.contains(it) && it.activities.contains(activity)) {
						it.activities.remove(activity)
						it.save(flush:true)
					}
				} 
			}
			return activity.save(flush:true)
		}
		return false
	}
	
	/**
	 * Retorna atividade pelo id armazenado no sistema.
	 *  
	 * @param 	id 			Id da atividade
	 * @return 	null  		Caso o id seja inexistente
	 * 			atividade 	Caso contrário
	 */
	def getActivityById(id) {
		return Activity.get(id)
	}

	/**
	 * Retorna uma lista de atividades previstas referente a um ano.
	 *  
	 * @param	year		Ano das atividades
	 * @return 	atividades	Lista das atividades
	 */
	def getPlanned(year) {
		def list = Activity.findAllByStatus(ActivityStatus.NOT_STARTED, [sort:"startDate"]);
		def output = []
		list.each {
			if (it.startDate.format('yyyy') == year) {
				output.add(it)
			}
		}
		return output
	}
	
	/**
	 * Retorna uma lista de atividades em andamento referente a um ano.
	 *  
	 * @param	year		Ano das atividades
	 * @return 	atividades	Lista das atividades
	 */
	def getOngoing(year) {
		def list = Activity.findAllByStatus(ActivityStatus.ONGOING, [sort:"startDate"]);
		def output = []
		list.each {
			if (it.startDate.format('yyyy') == year) {
				output.add(it)
			}
		}
		return output
	}
	
	/**
	 * Retorna uma lista de atividades concluídas referente a um ano.
	 *  
	 * @param	year		Ano das atividades
	 * @return 	atividades	Lista das atividades
	 */
	def getDone(year) {
		def list = Activity.findAllByStatus(ActivityStatus.FINISHED, [sort:"startDate"]);
		def output = []
		list.each {
			if (it.startDate.format('yyyy') == year) {
				output.add(it)
			}
		}
		return output
	}
	
	/**
	 * Retorna atividade pelo id do petiano responsável armazenada no sistema.
	 *  
	 * @param 	id 			Id do petiano
	 * @return 	null 		Caso o id seja inexistente
	 * 			atividade 	Caso contrário
	 */
	def getActivityBySponsorId(id) {
		return Activity.findBySponsor(Petiano.get(id))
	}
	
	/**
	 * Marca atividade como relizada no banco de dados do sistema.
	 *  
	 * @return 	null 		Caso o id seja inexistente
	 * 			atividade 	Caso contrário
	 */
	def confirm(activity) {
		activity.status = ActivityStatus.FINISHED
		if (activity.validate()) {
			return activity.save(flush: true)
		}
		return false
	}
	
	/**
	 * Remove atividade armazenada no sistema passado como argumento.
	 * 
	 * @param 	activity 	Atividade a ser removida
	 * @return	null 		Caso ocorra algum erro durante remoção
	 * 			true 		Caso contrário
	 */
	def delete(activity) {
		def oldSponsors = User.list([activities:"eager"])
		oldSponsors.each {
			if (activity.sponsors.contains(it)) {
				it.activities.remove(activity)
				it.save(flush:true)
			}
		}
		return activity.delete(flush:true)
	}
	
}
